// Map

// 1. 基本语法

// 定义一个空的 Map 实例
let map1 = new Map();
console.log(map1);


// 也可以在实例化的同时传入默认的数据
let map2 = new Map([[1, 'one'], [2, 'two']]);
console.log(map2);

let keyObj = {};
let map3 = new Map([[keyObj, 'three']]);
console.log(map3);


// 2. 常用方法

// 添加数据
let keyString = "hello";
let keyObj2 = {
    name: "jayjun"
};
let keyFunc = function() {};
map1.set(keyString, "和hello相关联的值");
map1.set(keyObj2, "和keyObj2相关联的值");
map1.set(keyFunc, "和keyFunc相关联的值");
console.log(map1);

// 统计数据

// 统计所有key-value的总和
console.log(map1.size); // 3

// 判断是否有key-value
console.log(map1.has(keyFunc));     // true
console.log(map1.has("keyFunc"));   // false

// 查询数据
console.log(map1.get(keyFunc));     // 和keyFunc相关联的值
console.log(map1.get("keyFunc"));   // undefined

// 删除数据

// 删除指定的数据
map1.delete(keyFunc);
console.log(map1.size); // 2

// 删除所有的数据
map1.clear();
console.log(map1.size); // 0

// 3. 遍历方式

let map4 = new Map([[1, 'one'], [2, 'two'], [3, 'three']]);
console.log(map4);

map4.forEach((value, key) => {
    console.log(key, value);
});

for(let item of map4) {
    console.log(item[0], item[1]);
}

for(let [key, value] of map4) {
    console.log(key, value);
}

for(let [key, value] of map4.entries()) {
    console.log(key, value);
}

for(let key of map4.keys()) {
    console.log(key);
}

for(let value of map4.values()) {
    console.log(value);
}

// 总结：Map 和 Object 对比

// 1. 键的类型
// Map的键可以是任务的值，包括函数、对象等。Object的键只能是字符串或Symbol

// 2. 键值对的统计
// Map可以通过size属性，Object的键值对的个数只能手动计算。

// 4. WeakMap

let wm1 = new WeakMap();

// wm1.set(1, 1); // TypeError: Invalid value used as weak map key

let obj = {
    name: "jayjun"
}
wm1.set(obj, 1);
console.log(wm1.get(obj));

// wm1.forEach(item => {
//     console.log(item) // TypeError: wm1.forEach is not a function
// })

